/* 
  扩展运算符和rest运算符
    可以很好的为我们解决参数和对象数组未知情况下的编程，让我们的代码更健壮和简洁

  --------------------------------------------------------------------------
  对象扩展运算符（…）：  
    当编写一个方法时，我们允许它传入的参数是不确定的。这时候可以使用对象扩展运算符来作参数，看一个简单的列子：

  function jspang(...arg){
    console.log(arg[0]);
    console.log(arg[1]);
    console.log(arg[2]);
    console.log(arg[3]);
 
  }
  jspang(1,2,3);  

  这时我们看到控制台输出了 1,2,3，undefined，这说明是可以传入多个值，并且就算方法中引用多了也不会报错。

  --------------------------------------------------------------------------

  扩展运算符的用处：
  我们先用一个例子说明，我们声明两个数组arr1和arr2，然后我们把arr1赋值给arr2，然后我们改变arr2的值，你会发现arr1的值也改变了，因为我们这是对内存堆栈的引用，而不是真正的赋值。

  let arr1=['www','jspang','com'];
  let arr2=arr1;
  console.log(arr2);
  arr2.push('shengHongYu');
  console.log(arr1);

  控制台输出：
  ["www", "jspang", "com"]
  ["www", "jspang", "com", "shengHongYu"]

  这是我们不想看到的，可以利用对象扩展运算符简单的解决这个问题，现在我们对代码进行改造。

  let arr1=['www','jspang','com'];
  //let arr2=arr1;
  let arr2=[...arr1];
  console.log(arr2);
  arr2.push('shengHongYu');
  console.log(arr2);
  console.log(arr1);
  现在控制台预览时，你可以看到我们的arr1并没有改变，简单的扩展运算符就解决了这个问题。

  --------------------------------------------------------------------------

  rest运算符
    如果你已经很好的掌握了对象扩展运算符，那么理解rest运算符并不困难，它们有很多相似之处，甚至很多时候你不用特意去区分。它也用…（三个点）来表示，我们先来看一个例子。

  
  function jspang(first,...arg){
  console.log(arg.length);
  }
 
  jspang(0,1,2,3,4,5,6,7);

  这时候控制台打印出了7，说明我们arg里有7个数组元素，这就是rest运算符的最简单用法。

  如何循环输出rest运算符

  这里我们用for…of循环来进行打印出arg的值，我们这里只是简单使用一下，以后我们会专门讲解for…of循环。
  function jspang(first,...arg){
      for(let val of arg){
          console.log(val);
      }
  }
  
  jspang(0,1,2,3,4,5,6,7);

  for…of的循环可以避免我们开拓内存空间，增加代码运行效率，所以建议大家在以后的工作中使用for…of循环。有的小伙伴会说了，反正最后要转换成ES5，没有什么差别，但是至少从代码量上我们少打了一些单词，这就是开发效率的提高。

*/



// function add(...arg){
//   // ... arg 是一个数组 ,可以理解为es5里面的argument
//   console.log(arg[0])
//   console.log(arg[1])
//   console.log(arg[2])
// }
// add(0,1,2,3,4,5);  //少传,里面多拿,undefind值,但是程序不报错, 多传也不报错

// ---------------------------------------------------
// let arr=[1,2,3,4,5,6,7];
// let arr2=arr;
// console.log(arr2);  //[1, 2, 3, 4, 5, 6, 7]
// arr2.push('新增内容');
// console.log(arr);  // [1, 2, 3, 4, 5, 6, 7, "新增内容"]  //arr2的改变,也会改变到arr,这是数组对象堆栈问题,解决办法


// let arr=[1,2,3,4,5,6,7];
// let arr2=[...arr];  //解决问题
// console.log(arr2);  //[1, 2, 3, 4, 5, 6, 7]
// arr2.push('新增内容');
// console.log(arr2);
// console.log(arr);

// ------------------------------------------

// function wf(first,...amd){
//   console.log(first);  //0
//   console.log(amd.length);  //7  证明第一个first ,取得是第一个,后面的amd取得是全部的
// }
// wf(0,1,2,3,4,5,6,7);


// 取出里面的每个值

function zwf(first,...amd){
  for(let item of amd){
    console.log(item);  //从第二个开始取,因为第一个是first占位了
  }
}
zwf(1,2,3,56,5,8,5,6,5,6,4);
